#ifndef IMAGEPROCESSOR_H
#define IMAGEPROCESSOR_H

#include <QObject>
#include <QImage>
#include <QPainter>
#include <QColor>
#include "enhanceparams.h"
#include "layoutstatemanager.h"

// Martin Fowler重构：Introduce Parameter Object - DPI配置对象
struct DpiConfiguration {
    double processingDpi;
    double displayDpi;

    DpiConfiguration(double processing = 150.0, double display = 150.0)
        : processingDpi(processing), displayDpi(display) {}

    // Martin Fowler重构：Extract Method - A4尺寸计算
    QSize calculateA4Size() const {
        int width = static_cast<int>(210.0 / 25.4 * processingDpi);   // A4宽度（毫米转像素）
        int height = static_cast<int>(297.0 / 25.4 * processingDpi);  // A4高度（毫米转像素）


        return QSize(width, height);
    }

    QString toString() const {
        QSize a4 = calculateA4Size();
        return QString("Processing: %1 DPI, Display: %2 DPI, A4Size: %3x%4px")
               .arg(processingDpi).arg(displayDpi).arg(a4.width()).arg(a4.height());
    }
};

class ImageProcessor : public QObject
{
    Q_OBJECT

public:
    // 使用统一的布局模式枚举
    using ColumnMode = LayoutMode;

    explicit ImageProcessor(QObject *parent = nullptr);

    // Martin Fowler重构：Introduce Parameter - DPI依赖注入
    void setDpiConfiguration(const DpiConfiguration& config);
    
    // 主要公共接口
    QList<QImage> splitImage(const QImage& image, ColumnMode mode);
    QImage enhanceImage(const QImage& image, const EnhanceParams& params);
    
    // 优化方法：只计算页数而不实际分割图片
    int calculateImagePageCount(const QImage& image, ColumnMode mode);
    
    // 预计算所有分割位置（确保一致性）- 只按A4大小切割
    QList<int> calculateSplitPositions(const QImage& image);
    
    // 根据预计算的位置生成指定范围的切片 - 只按A4大小切割
    QList<QImage> generateSlicesAtPositions(const QImage& image, const QList<int>& splitPositions, 
                                          int startSliceIndex, int sliceCount);
    
    // 图像分割相关的公共方法
    QColor detectBackgroundColor(const QImage& image);
    bool isSimilarColor(const QColor& c1, const QColor& c2, int threshold = 30);
    bool isEmptyRow(const QImage& image, int y, const QColor& bgColor, int threshold = 30);
    int findBestSplitPosition(const QImage& image, int startY, int targetHeight, const QColor& bgColor);
    QImage createPaddedSlice(const QImage& source, int targetHeight, const QColor& bgColor);
    QImage arrangeColumnsOnA4(const QList<QImage>& columns);
    int calculatePageHeight(const QImage& image, ColumnMode mode);
    QList<int> findSplitPositions(const QImage& image, const QColor& bgColor);
    QImage createA4Page(const QImage& image, const QColor& bgColor);

private:
    // 图像增强相关方法
    QImage adjustBrightness(const QImage& image, int value);
    QImage adjustContrast(const QImage& image, int value);
    QImage sharpenImage(const QImage& image, int value);
    QImage denoiseImage(const QImage& image);
    QImage autoRotateImage(const QImage& image);
    QImage adjustColorMode(const QImage& image, int mode);

    // Martin Fowler重构：Encapsulate Field - DPI配置封装
    DpiConfiguration m_dpiConfig;

    // Martin Fowler重构：Extract Method - 动态A4尺寸获取
    QSize getCurrentA4Size() const { return m_dpiConfig.calculateA4Size(); }
};

#endif // IMAGEPROCESSOR_H